package com.sxj.corejava.code12_jdbc;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 石小俊
 * @date 2024年06月27日 14:06
 */
public class Test01_快速入门 {

    public static void main(String[] args) {
//        User user = new User("admin", "123456", "13812345678", "江苏-南京");
        User user = new User("alice", "111111", "13912345678", "江苏-苏州");
        insertUser(user);
//        List<User> users = findAll();
//        for (User user : users) {
//            System.out.println(user);
//        }

//        User user = new User(1, "jack", "222222", "13112345678", "江苏-泰州");
//        updateUser(user);

//        deleteById(2);

//        User user = findById(1);
//        System.out.println(user);
    }


    public static void insertUser(User user) {
        // 在Java中通过JDBC访问数据库
        // 共有以下几个步骤
        Connection conn = null;
        Statement st = null;
        try {
            // 1.注册驱动:Class.forName(驱动所在的包名.类名)
            // 注册由对应的数据库厂商所提供的驱动
            // 根据驱动不同可以知道当前是哪一个厂商,且是哪一个版本
            // 则可以使用对应数据库厂商提供的驱动版本进行数据库的操作
            // 不同版本中驱动所在的包可能不一致
            Class.forName("com.mysql.jdbc.Driver");
            // Class.forName("com.mysql.cj.jdbc.Driver");

            // 2.获取连接
            // 连接到指定的数据库,由数据库厂商提供连接方式
            // 参数一:连接数据库的url地址
            // 对于MySQL而言,其地址格式为 jdbc:mysql://mysql服务ip地址:端口号/库名
            // 默认情况下,如果是本机的数据库,其ip地址默认可以使用127.0.0.1或者localhost表示本地地址
            // 也可以使用本机的服务器地址,不同用户的主机ip可能不一样,可以在终端中通过ipconfig命令查询对应ipv4的地址
            // MySQL端口号默认为3306,一般不会进行修改
            // 目前,我们所有操作基本都是本机装好的数据库
            // 因此,默认即为 jdbc:mysql://127.0.0.1:3306/jdbc
            // 参数二:数据库的用户名
            // 参数三:数据库的密码
            // conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc","root","");
            // 在访问jdbc时可能会出现乱码,可以在url地址中指定字符集
            // ?useUnicode=true&characterEncoding=utf-8
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "");

            // 3.获取状态集,用于操作数据库
            st = conn.createStatement();

            // 4.执行sql
            // 准备一个需要执行的sql语句
            String sql = "insert into t_user(username,password,phone,address) values('" + user.getUsername() + "','" + user.getPassword() + "','" + user.getPhone() + "','" + user.getAddress() + "')";
            // 执行sql,此时分为增删改操作与查询操作
            // 两种操作有区别
            // 当前属于增删改操作
            // 方法返回值表示的是几行数据受到了影响
            int row = st.executeUpdate(sql);
            System.out.println("Query ok, " + row + " rows affected");

            // 如果是查询,还有第五步
            // 5.处理结果集
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("未找到驱动");
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("数据库访问异常");
        } finally {
            // 6.释放资源
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放连接失败!");
                }
            }
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放状态集失败!");
                }
            }
        }
    }

    public static List<User> findAll() {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        List<User> users = new ArrayList<>();
        try {
            // 1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 2.获取连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "");
            // 3.获取状态集
            st = conn.createStatement();
            // 4.执行sql
            String sql = "select id,username,password,phone,address from t_user";
            // 获取结果集
            rs = st.executeQuery(sql);
            // 此时获取到了结果集
            // 所谓的结果集,就是从数据库中查询到的一系列的数据
            // 这些数据是按照数据库的结构,存在多行数据
            // 但是在Java中无法直接展示
            // 需要将结果集中的数据映射成Java中的对象或者对象集合
            // 每一行数据对应一个Java对象
            // 5.处理结果集
            // 通过next()获取下一行数据,每次获取光标会向前移动一行
            // 返回值是boolean类型,只要下一行有数据就返回true,当没有数据时返回false
            // 通过while循环实现对多行数据的处理
            while (rs.next()) {
                // 只要next方法返回值为true,则表示读取到了一行数据
                // 此时需要将这一行数据映射成Java对象
                // 可以通过getXxx(int index)获取第index列的数据
                // Xxx表示将对应数据映射成Java的什么类型
                // int id = rs.getInt(1);
                // 也可以通过getXxx(String column)获取指定列的数据
                // int id2 = rs.getInt("id");

                // 由于最终需要将结果集中的数据映射成Java对象
                // 因此,每次遍历一行数据时,可以初始化一个Java对象
                User user = new User();
                // 将每一列的数据映射到该对象的每一个属性中
                user.setId(rs.getInt("id"));
                user.setUsername(rs.getString("username"));
                user.setPassword(rs.getString("password"));
                user.setPhone(rs.getString("phone"));
                user.setAddress(rs.getString("address"));
                // 将映射好的Java对象存储到对应的集合中
                // 每映射一行数据,生成一个Java对象,添加到指定的集合中
                users.add(user);
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 6.释放资源
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放连接失败!");
                }
            }
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放状态集失败!");
                }
            }
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放结果集失败!");
                }
            }
        }
        return users;
    }

    public static void updateUser(User user) {
        Connection conn = null;
        Statement st = null;
        try {
            // 1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");

            // 2.获取连接
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "");

            // 3.获取状态集
            st = conn.createStatement();

            // 4.执行sql
            String sql = "update t_user set username = '" + user.getUsername() + "',password = '" + user.getPassword() + "', phone = '" + user.getPhone() + "', address = '" + user.getAddress() + "' where id = " + user.getId() + "";
            st.executeUpdate(sql);

            System.out.println("修改成功");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 6.释放资源
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放连接失败!");
                }
            }
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放状态集失败!");
                }
            }
        }


    }

    public static void deleteById(Integer id) {
        Connection conn = null;
        Statement st = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "");
            st = conn.createStatement();
            String sql = "delete from t_user where id = " + id + "";
            st.executeUpdate(sql);
            System.out.println("id为" + id + "的数据删除成功");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 6.释放资源
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放连接失败!");
                }
            }
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放状态集失败!");
                }
            }
        }
    }

    public static User findById(Integer id) {
        Connection conn = null;
        Statement st = null;
        ResultSet rs = null;
        User user = null;
        try {
            // 1.注册驱动
            Class.forName("com.mysql.jdbc.Driver");

            // 2.获取连接
            conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8", "root", "");

            // 3.获取状态集
            st = conn.createStatement();

            // 4.执行sql
            String sql = "select id,username,password,phone,address from t_user where id = " + id + "";
            rs = st.executeQuery(sql);

            // 5.结果集映射
            if (rs.next()) {
                user = new User();
                // user.setId(rs.getInt("id"));
                // user.setUsername(rs.getString("username"));
                // user.setPassword(rs.getString("password"));
                // user.setPhone(rs.getString("phone"));
                // user.setAddress(rs.getString("address"));
                user.setId(rs.getInt(1));
                user.setUsername(rs.getString(2));
                user.setPassword(rs.getString(3));
                user.setPhone(rs.getString(4));
                user.setAddress(rs.getString(5));
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 6.释放资源
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放连接失败!");
                }
            }
            if (st != null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放状态集失败!");
                }
            }
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                    System.out.println("释放结果集失败!");
                }
            }
        }

        return user;
    }

}
